package com.bto.solar.work.utils.tree;

import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.bto.solar.work.utils.NullUtils;
import java.util.*;

/**
 * @author Administrator
 */
public class TreeUtils {

    public static  <T extends ITree<T>> List<T> getTree (List<T> dbList, Map<String , T> map) {
        //实现树形结构
        List<T> list = new ArrayList<>();

        //实现树形结构
        for (T db : dbList) {
            //根据最高级组织中parentCode为0或者以parentCode为组织编码查不到组织的原理，把最高级组织对象add到list结构中
            if (db.getParentId() == null || "0".equals(db.getParentId().toString())){
                list.add(db);
            }else {
                //获取父id
                String code = db.getParentId().toString();
                T parent = map.get(code);
                // 获取父节点的子节点
                Collection<T> children = parent.getChildList();
                // 如果子节点为空，则新建一个子节点
                if (CollectionUtils.isEmpty(children)){
                    parent.setChildList(new ArrayList<>());
                }
                // 将db添加到父节点的子节点中
                parent.getChildList().add(db);
            }
        }

        return list;
    }

    public static <T extends ITree<T>>  List<Long> getIdList(List<T> dbList,  Long parentId) {

        List<Long> idList = new ArrayList<>();
        idList.add(parentId);
        if (NullUtils.isNotEmpty(dbList)) {
            flushRoleIdList(dbList, parentId, idList);
            return idList;
        }

        return Collections.emptyList();
    }

    private static <T extends ITree<T>> void flushRoleIdList(List<T> dbList, Long parentId, List<Long> idList) {
        //存放父节点的列表
        List<T> childRoleIdList = new ArrayList<>();
        for (T db : dbList) {
            //通过该父节点的Id与所有菜单的parentId对比。找出该父节点的子节点
            Long dbParentId = db.getParentId();
            if (parentId.equals(dbParentId)) {
                //把该父节点的子节点加入该父节点的列表
                childRoleIdList.add(db);
                idList.add(db.getId());
            }
        }

        if (NullUtils.isNotEmpty(childRoleIdList)) {
            //遍历父节点列表的子节点
            for (T child : childRoleIdList) {
                //使用回调找出该父节点列表的子节点的子节点
                flushRoleIdList(dbList, child.getId(), idList);
            }
        }
    }


}
